package cn.demoncat.util.conn;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

import cn.demoncat.util.exception.ConnRuntimeException;
import cn.demoncat.util.io.CloseUtil;
import cn.demoncat.util.web.IpUtil;

/**
 * Socket连接
 * 
 * @author 延晓磊
 *
 * @since 2019年11月4日
 */
public class SocketConn extends Conn{

	// Socket
	protected Socket socket;
		
	/**
	 * 创建Socket连接
	 * 
	 * @param url		连接地址
	 * @param config	连接配置
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年11月4日
	 */
	public <C extends ConnPoolConfig<T>, T>SocketConn(String url, C config) {
		super(url, config);
		try {
        	// 创建连接
            socket = new Socket();
            socket.setReuseAddress(true);
            socket.setSoTimeout(config.getSoTimeout());
            socket.connect(IpUtil.getSocketAddr(url), config.getConnectTimeout());
        } catch (IOException e) {
            throw new ConnRuntimeException("创建连接失败：url = " + url, e);
        }
	}

    /**
     * 关闭
     *
     * @author 延晓磊
     *
     * @since 2019年11月4日
     */
	@Override
	public void close() {
		CloseUtil.close(socket);
	}

	/**
	 * 是否关闭
	 * 
	 * @return
	 *
	 * @author 延晓磊
	 *
	 * @since 2019年11月4日
	 */
	@Override
	public boolean isClosed() {
		return socket.isClosed();
	}

	/**
	 * 检查
	 * 
	 * @return
	 * @throws IOException
	 *
	 * @author 延晓磊
	 *
	 * @since 2019年11月4日
	 */
	@Override
	protected boolean toValid() throws IOException {
		return !socket.isClosed() && socket.isConnected();
	}

	/**
	 * 输出流
	 * 
	 * @return
	 * @throws IOException
	 *
	 * @author 延晓磊
	 *
	 * @since 2019年11月4日
	 */
	@Override
	public OutputStream getOutputStream() throws IOException {
		return socket.getOutputStream();
	}
	
	/**
	 * 输入流
	 * 
	 * @return
	 * @throws IOException
	 *
	 * @author 延晓磊
	 *
	 * @since 2019年11月4日
	 */
	@Override
	public InputStream getInputStream() throws IOException {
		return socket.getInputStream();
	}

	
}
